﻿using OCR.SettingsForm;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OCR
{
    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

            // 注册UI和后台异常事件
            Application.ThreadException += HandleUiThreadException;
            AppDomain.CurrentDomain.UnhandledException += HandleBackgroundException;

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new OCR_Form());
        }

        // 定义异常处理方法
        private static void HandleUiThreadException(object sender, ThreadExceptionEventArgs e)
        {
            // 防崩盾核心代码：
            // ① 记录详细日志
            LogException(e.Exception);
            // ② 友好提示用户
            MessageBox.Show(
                $"程序遇到了故障~\n\n错误信息：{e.Exception.Message}",
                "程序助手",
                MessageBoxButtons.OK,
                MessageBoxIcon.Error
            );
            // ③ 退出（可选）
            Application.Exit();
        }
        // 创建日志记录方法
        private static void LogException(Exception ex)
        {
            string errorFilePath = Environment.CurrentDirectory + "/LogError";
            if (!Directory.Exists(errorFilePath))
            {
                Directory.CreateDirectory(errorFilePath);
                Console.WriteLine($"创建文件夹: {errorFilePath}");
            }
            // ① 生成唯一日志文件名（如：Error_20231010_150000.log）
            string logFileName = $"Error_{DateTime.Now:yyyyMMdd_HHmmss}.log";
            string logPath = Path.Combine(errorFilePath, logFileName);
            // ② 写入日志内容
            File.WriteAllText(logPath,
                $"【异常时间】{DateTime.Now}\n" +
                $"【异常类型】{ex.GetType().Name}\n" +
                $"【异常消息】{ex.Message}\n" +
                $"【堆栈跟踪】{ex.StackTrace}\n" +
                $"【内部详情】{ex.InnerException?.Message}"
            );
        }
        // 定义后台异常处理方法
        private static void HandleBackgroundException(object sender, UnhandledExceptionEventArgs e)
        {
            // 防崩盾核心代码：
            // ① 强制转换异常对象
            Exception ex = e.ExceptionObject as Exception ?? new Exception("未知异常");
            // ② 记录日志
            LogException(ex);
            // ③ 弹窗提示（需谨慎！非UI线程无法直接操作界面）
            // 注意：这里只能通过线程安全方式提示，如写入日志后退出
            Application.Exit();
        }

        private static void LogException()
        {
            string errorFilePath = Environment.CurrentDirectory + "/LogError";
            if (!Directory.Exists(errorFilePath))
            {
                Directory.CreateDirectory(errorFilePath);
                Console.WriteLine($"创建文件夹: {errorFilePath}");
            }
            // ① 生成唯一日志文件名（如：Error_20231010_150000.log）
            string logFileName = $"Error_{DateTime.Now:yyyyMMdd_HHmmss}.log";
            string logPath = Path.Combine(errorFilePath, logFileName);
            // ② 写入日志内容
            File.WriteAllText(logPath,
                $"【异常时间】{DateTime.Now}\n" 
            );
        }
    }
}
